<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>二分法搜索</title>
</head>

<body>

</body>
<script>
  // 二分法搜索更多的应用场景在数组中值唯一并且有序的数组中;
  /* 
    基本思路：从序列的中间位置开始比较，如果当前位置值等于要搜索的值，则查找成功；若要搜索的值小于当前位置值，则在数列的前半段中查找；若要搜索的值大于当前位置值则在数列的后半段中继续查找，直到找到为止
  */
  "use strict"; {
    let binarySearch = (arr, value) => {
      let min = 0;
      let max = arr.length - 1;
      while (min <= max) {
        const mid = Math.floor((min + max) / 2);
        if (arr[mid] === value) {
          return mid;
        } else if (arr[mid] > value) {
          max = mid - 1;
        } else {
          min = mid + 1;
        };
      };
      return 'Not Found';
    };
  }; {
    let arr = [122, 12, 3, 456, 89, 100];
    const searching = (target) => {
      // 同时声明起始位置，末位置，中间位置，中间数
      let start = 0, end = arr.length - 1, middle, element;

      //1.当起点和终点一样时(start == end) ,也就剩下一个元素了(目标元素)
      //2.剩下两个元素时，依旧进行判断
      while (start <= end) {
        middle = Math.floor((start + end) / 2); //获取中间位置
        element = arr[middle]; //获取中间数
        if (element === target) { //当中间数等于目标数时，则返回元素
          return element;
        } else if (element > target) { //当中间数大于目标数时，改变末位置
          end = middle - 1;
        } else {
          start = middle + 1; //当中间数小于目标数时，改变起始位置
        };
      };
      return -1; //当目标数据没有在数组中时，返回-1
    };
    console.log(searching(9));
  }
</script>

</html>